package org.ruoyi.knowledge.service;

import org.springframework.web.multipart.MultipartFile;

import java.util.List;
import java.util.Map;

/**
 * Ragflow服务接口
 * 
 * @author Lion Li
 * @date 2024-10-23
 */
public interface RagflowService {

    /**
     * 创建Ragflow数据集
     * 
     * @param datasetName 数据集名称
     * @return 数据集ID
     */
    String createDataset(String datasetName);

    /**
     * 创建Ragflow数据集（带配置）
     * 
     * @param datasetName 数据集名称
     * @param embeddingModel 嵌入模型
     * @param chunkMethod 分块方法
     * @param parserConfig 解析器配置
     * @param permission 权限（可选）
     * @return 数据集ID
     */
    String createDataset(String datasetName, String embeddingModel, String chunkMethod, Map<String, Object> parserConfig, String permission);

    /**
     * 获取数据集ID（根据名称）
     * 
     * @param datasetName 数据集名称
     * @return 数据集ID，如果不存在返回null
     */
    String getDatasetIdByName(String datasetName);

    /**
     * 上传文档到Ragflow
     * 
     * @param datasetId 数据集ID
     * @param file 文件
     * @return 文档ID列表
     */
    List<String> uploadDocument(String datasetId, MultipartFile file);

    /**
     * 批量上传文档到Ragflow
     * 
     * @param datasetId 数据集ID
     * @param files 文件列表
     * @return 文档ID列表
     */
    List<String> uploadDocuments(String datasetId, List<MultipartFile> files);

    /**
     * 解析文档（生成向量）
     * 
     * @param datasetId 数据集ID
     * @param documentIds 文档ID列表
     * @return 是否成功
     */
    boolean parseDocuments(String datasetId, List<String> documentIds);

    /**
     * 删除数据集
     * 
     * @param datasetId 数据集ID
     * @return 是否成功
     */
    boolean deleteDataset(String datasetId);

    /**
     * 检查Ragflow服务是否可用
     * 
     * @return 是否可用
     */
    boolean isServiceAvailable();
    
    /**
     * 获取所有数据集
     * 
     * @return 数据集列表
     */
    List<Map<String, Object>> getAllDatasets();

    /**
     * 删除文档
     * 
     * @param datasetId 数据集ID
     * @param documentId 文档ID
     * @return 是否成功
     */
    boolean deleteDocument(String datasetId, String documentId);

    /**
     * 获取数据集中的文档列表
     * 
     * @param datasetId 数据集ID
     * @return 文档列表
     */
    List<Map<String, Object>> getDocuments(String datasetId);

    /**
     * 更新数据集
     * 
     * @param datasetId 数据集ID
     * @param updateData 更新数据
     * @return 是否成功
     */
    boolean updateDataset(String datasetId, Map<String, Object> updateData);

    /**
     * 获取文档信息
     * 
     * @param datasetId 数据集ID
     * @param documentId 文档ID
     * @return 文档信息
     */
    Map<String, Object> getDocument(String datasetId, String documentId);

    /**
     * 获取文档的片段（chunks）
     * 
     * @param datasetId 数据集ID
     * @param documentId 文档ID
     * @param pageNum 页码
     * @param pageSize 每页大小
     * @return 片段列表
     */
    Map<String, Object> getDocumentChunks(String datasetId, String documentId, int pageNum, int pageSize);

    /**
     * 同步知识库与RAGFlow数据集
     * 将本地知识库的附件上传到RAGFlow数据集
     * 
     * @param kid 知识库ID
     * @return 是否成功
     */
    boolean syncKnowledgeToRagflow(String kid);

    /**
     * 批量删除文档
     * 
     * @param datasetId 数据集ID
     * @param documentIds 文档ID列表
     * @return 是否成功
     */
    boolean batchDeleteDocuments(String datasetId, List<String> documentIds);
}
